package com.example.day3.stream;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

// Collector 收集器
public class C12CollectorTest {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("令狐冲", "风清扬", "独孤求败", "方证",
                "东方不败", "冲虚", "向问天", "任我行", "不戒");

        // 1.把流中的数据收集到List中
        // List<String> result = stream.collect(Collectors.toList());

        // 2.把流中的数据收集到Set中
        // Set<String> result = stream.collect(Collectors.toSet());

        // 3.把流中的数据收集到StringBuilder中
        // String result = stream.collect(Collectors.joining());

        // 4.把流中的数据收集到StringJoiner中
        // 收集到StringBuilder或者StringJoiner中调用的都是Collectors.joining方法,根据是否传递参数会去调用不同的方法实现
        // String result = stream.collect(Collectors.joining(","));

        // 5.把流中的数据收集到Map中
        // Map<String, Integer> map = stream.collect(Collectors.toMap(x -> x, x -> 1));
        /*
            需求：把流中的数据收集到Map中 键是长度,值是名称
            Map
            3: new ArrayList(["令狐冲","风清扬","向问天","任我行"])
            4: new ArrayList(["独孤求败","东方不败"])
            2: new ArrayList(["方证","冲虚","不戒"])
         */
        // Map<Integer, List<String>> result = stream.collect(Collectors.groupingBy(x -> x.length(), Collectors.toList()));
        // 使用方法引用简化
        // 其中Collectors.toList()这个称为下游收集器 Collectors.groupingBy()称为上游收集器
        Map<Integer, List<String>> result = stream.collect(Collectors.groupingBy(String::length, Collectors.toList()));
        result.forEach((key, value) -> System.out.println(key + ":" + value));
    }

    record Hero(String name, int strength) {

    }
}
